package com.shxy.api.controller;

import com.shxy.api.bean.user.RoleBean;
import com.shxy.api.bean.user.UserInfo;
import com.shxy.api.common.ApiResult;
import com.shxy.api.common.ResultCode;
import com.shxy.api.controller.ui.LoginData;
import com.shxy.api.controller.ui.UserAdd;
import com.shxy.api.service.ILoginService;
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.util.HashMap;
import java.util.Map;

/**
 * 登录控制器
 */
@RestController
@RequestMapping("/v1/login")
@Log
@Validated
public class LoginController {
    @Autowired
    private ILoginService loginService;

    /**
     * 用户登录
     * @param user 登录数据
     * @return
     */
    @PostMapping("/in")
    public ApiResult login(@RequestBody LoginData user) {
        // 1、根据账号查询用户信息
        UserInfo userInfo = loginService.getUserByName(user.getUsername());

        // 2、检查账号是否存在和密码是否正确
        if(userInfo == null || !userInfo.getPassword().equals(user.getPassword())) {
            return ApiResult.create(ResultCode.USER_CREDENTIALS_ERROR);
        }

        // 3、构造返回信息
        return ApiResult.create(convertUserInfo(userInfo));
    }

    /**
     * 根据编号查询用户信息
     * @param id 编号
     * @return
     */
    @GetMapping("/user/info/{id}")
    public ApiResult getUserInfo(@PathVariable(name = "id") String id) {
        // 1、根据编号获取用户信息
        UserInfo userInfo = loginService.getUserById(id);
        // 2、如果用户不存在
        if(userInfo == null){
            return ApiResult.create(ResultCode.USER_ACCOUNT_NOT_EXIST);
        }
        // 3、返回用户结果
        return ApiResult.create(convertUserInfo(userInfo));
    }

    /**
     * 用户信息返回格式转换
     * @param userInfo 用户信息
     * @return
     */
    private Map<String, Object> convertUserInfo(UserInfo userInfo) {
        Map<String, Object> map = new HashMap<>();
        map.put("token", userInfo.getId());
        map.put("name", userInfo.getUsername());
        map.put("role", userInfo.getRole().getName());
        map.put("avatar", userInfo.getAvatar());
        map.put("introduction", userInfo.getIntroduction());
        return map;
    }

    /**
     * 用户登出
     * @param userId 用户编号
     * @return
     */
    @PostMapping("/out/{id}")
    public ApiResult logout(@PathVariable(name = "id") String userId) {
        return ApiResult.success();
    }

    /**
     * 添加用户
     * @param user 用户信息
     * @return
     */
    @PostMapping("/user/add")
    public ApiResult addUser(@RequestBody @Valid UserAdd user) {
        // 1、如果用户名存在
        if(loginService.isUserNameExist(user.getUsername())) {
            return ApiResult.create(ResultCode.USER_ACCOUNT_ALREADY_EXIST);
        }
        // 2、保存账户信息
        String userId = loginService.addUser(user.getUsername(), user.getPassword(), user.getRealName(), user.getPhone());
        return ApiResult.create(userId);
    }

    /**
     * 添加角色
     * @param name 角色名
     * @return
     */
    @PostMapping("/role/add")
    public ApiResult addRole(@RequestParam @NotBlank(message = "名称不能为空") String name,
                             @RequestParam @NotBlank(message = "说明信息不能为空") String note) {
        // 1、如果角色名已存在
        if(loginService.isRoleNameExist(name)) {
            return ApiResult.create(ResultCode.USER_ROLE_IS_EXIST);
        }
        // 2、保存角色信息
        String roleId = loginService.addRole(name, note);
        return ApiResult.create(roleId);
    }

    /**
     * 设置用户角色
     * @param userId 用户编号
     * @param roleId 角色编号
     * @return
     */
    @PostMapping("/user/set/role")
    public ApiResult setUserRole(@RequestParam String userId,
                                 @RequestParam String roleId) {
        // 1、查询用户信息
        UserInfo user = loginService.getUserById(userId);
        if(user == null) {
            return ApiResult.create(ResultCode.USER_ACCOUNT_NOT_EXIST);
        }
        // 2、查询角色信息
        RoleBean role = loginService.getRoleById(roleId);
        if(role == null) {
            return ApiResult.create(ResultCode.USER_ROLE_NOT_EXIST);
        }

        // 3、设置用户角色
        String userRoleId = loginService.setUserRole(user, role);
        return ApiResult.create(userRoleId);
    }
}
